package main

import (
	"fmt"

	"gitee.com/go-course/grpc-demo/protobuf"
	"google.golang.org/protobuf/proto"
	"google.golang.org/protobuf/types/known/anypb"
)

type Option int

const (
	OptionA Option = 1
	OptionB Option = 2
)

type TestStruct struct {
	Option Option
}

func main() {
	s1 := &protobuf.String{
		Value: "中文测试",
	}

	ts := &TestStruct{
		Option: OptionA, // OptionB
	}
	fmt.Println(ts)

	payload, err := proto.Marshal(s1)
	if err != nil {
		panic(err)
	}
	fmt.Println(payload)

	s2 := &protobuf.String{}
	proto.Unmarshal(payload, s2)
	fmt.Println(s2)

	// One of 测试用例
	sm := &protobuf.SampleMessage{
		TestOneOf: &protobuf.SampleMessage_Sub2{
			Sub2: &protobuf.Sub2{Name: "test"},
		},
	}

	sm.GetSub1() // nil
	sm.GetSub2() // protobuf.SampleMessage_Sub2{}
	fmt.Println(sm.GetSub1())
	fmt.Println(sm.GetSub2())

	// any 使用

	/*
	 客户端的行为
	*/
	// 把 sub2转化为any类型
	any, _ := anypb.New(&protobuf.Sub1{Name: "test"})
	resp := &protobuf.Reponse{
		Code: 0,
		Data: any,
	}
	fmt.Println(resp)

	fmt.Println(resp.Data.TypeUrl)
	// any

	/*
	 服务端的行为
	*/

	// 已经知道 any是一个 sub1的类型
	foo := &protobuf.Sub1{}
	any.UnmarshalTo(foo)

	// if err := anypb.UnmarshalTo(resp.Data, foo, proto.UnmarshalOptions{}); err != nil {
	// 	fmt.Println(err)
	// }

	// fmt.Println(foo)

	// 如果我们不知道 any是什么类型
	// 通过断言获取他的类型, resp.Data.TypeUrl
	m, err := anypb.UnmarshalNew(resp.Data, proto.UnmarshalOptions{})
	if err != nil {
		fmt.Println(err)
	}

	switch m.(type) {
	case *protobuf.Sub1:
		fmt.Println(m)
	default:
		fmt.Println("unknown")
	}
}
